package com.ybbase.framework.common.util;

import com.alibaba.druid.util.StringUtils;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

/**
 * 验证工具类
 *
 * @author baijingbin
 * @date 2019/9/10 9:51 上午
 * @since 4.0
 */
public class VerifyUtil {

    private static final String MOBILE_REGEX = "^1\\d{10}$";

    private static final String PLATE_REGEX = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(?:(?![A-Z]{4})[A-Z0-9]){4}[A-Z0-9挂学警港澳]{1}$";

    private static final String DATE_REGEX = "^\\d{9}-\\d{2}-\\d{2}$";

    private static final String LENGTH_SCOPE_EIGHT_UNTIL_TWELVE_REGEX = "^\\d{8,12}$";

    private static final String IMPORT_NUMBER_AND_COMMA_REGEX = "^\\d+(,\\d*)*$";

    private static final String IMPORT_TWO_DECIMAL_REGEX = "^[0-9]+(.[0-9]{2})?$";

    private static final String IMPORT_NONZERO_INTEGER_REGEX = "^\\+?[1-9][0-9]*$";

    /**
     * 验证字符串非空，并且长度不超过指定
     *
     * @param str    要进行校验的字符串
     * @param length 长度
     * @return true 非空，并且过滤前后空格后长度不超过指定长度
     * @since 4.0
     */
    public static boolean verifyStrEmptyAndLength(String str, int length) {
        return !StringUtils.isEmpty(str) && str.trim().length() <= length;
    }

    /**
     * 判断字符串为非空，并且不超过length 指定长度的中文
     *
     * @param str    要判断的字符串
     * @param length 长度
     * @return true 非空，并且过滤前后空格后长度不超过指定长度
     * @since 4.0
     */
    public static boolean verifyChineseStrEmptyAndLength(String str, int length) {
        return verifyStrEmptyAndLength(str, length) && StringsUtil.isAllChinese(str);
    }

    /**
     * Long类型验证长度
     *
     * @param value  要验证的值
     * @param length 长度
     * @return true 非空且长度小于给定长度
     * @author shenaiguo
     */
    public static boolean verifyLength(Long value, int length) {
        return value != null && value.toString().length() <= length;
    }

    /**
     * Short类型验证长度
     *
     * @param value  要验证的值
     * @param length 长度
     * @return true 非空且长度小于给定长度
     * @author shenaiguo
     */
    public static boolean verifyLength(Short value, int length) {
        return value != null && value.toString().length() <= length;
    }

    /**
     * BigDecimal 类型验证精度
     *
     * @param value  要验证的值
     * @param length 长度
     * @return true 非空且长度小于给定长度
     * @author shenaiguo
     */
    public static boolean verifyLength(BigDecimal value, int length) {
        return value != null && value.toString().length() <= length;
    }

    /**
     * Integer 类型验证精度
     *
     * @param value  要验证的值
     * @param length 长度
     * @return true 非空且长度小于给定长度
     * @author shenaiguo
     */
    public static boolean verifyLength(Integer value, int length) {
        return value != null && value.toString().length() <= length;
    }

    /**
     * 判断是否有重复的值
     *
     * @param array 要验证的数组
     * @return true 不存在
     * @author shenaiguo
     */
    public static boolean cheakIsRepeat(String[] array) {
        Set<String> hashSet = new HashSet<String>();
        if (array != null && array.length > 0) {
            for (String a : array) {
                hashSet.add(a);
            }
            return (hashSet.size() == array.length);
        }
        return true;
    }

    /**
     * 手机验证
     *
     * @param phone 验证的手机号
     * @return true 手机号
     * @author shenaiguo
     */
    public static boolean isMobile(String phone) {
        return phone.matches(MOBILE_REGEX);
    }

    /**
     * 日期验证
     *
     * @param str 日期字符串
     * @return true 是日期
     * @author shenaiguo
     */
    public static boolean isValidDate(String str) {
        return str.matches(DATE_REGEX);
    }

    /**
     * 车牌验证
     *
     * @param plate 车牌号码
     * @return true 是车牌
     * @author baijingbin
     * @since 4.0
     */
    public static boolean isPlate(String plate) {
        return plate.matches(PLATE_REGEX);
    }

    /**
     * 验证输入长度 (8-12位)
     *
     * @param str 待验证值
     * @return true 匹配
     * @author xuwenwu
     * @date 2019-11-11 11:10
     * @since 4.0
     */
    public static boolean isLengthScope(String str) {
        return str.matches(LENGTH_SCOPE_EIGHT_UNTIL_TWELVE_REGEX);
    }

    /**
     * 验证输入值
     *
     * @param str 待验证值
     * @return true 匹配
     * @author xuwenwu
     * @date 2019-11-11 11:29
     * @since 4.0
     */
    public static boolean isNumberAndComma(String str) {
        return str.matches(IMPORT_NUMBER_AND_COMMA_REGEX);
    }

    /**
     * 验证输入两位小数
     *
     * @param str 待验证值
     * @return true 匹配
     * @author xuwenwu
     * @date 2019-11-11 11:34
     * @since 4.0
     */
    public static boolean IsTwoDecimal(String str) {
        return str.matches(IMPORT_TWO_DECIMAL_REGEX);
    }

    /**
     * 验证非零的正整数数值
     *
     * @param str 待验证值
     * @return true 匹配
     * @author xuwenwu
     * @date 2019-11-11 11:41
     * @since 4.0
     */
    public static boolean IsNonzeroNumber(String str) {
        return str.matches(IMPORT_NONZERO_INTEGER_REGEX);
    }

}
